package com.caption.jdk.optional;

import com.caption.jdk.lambda.Person;
import java.util.Optional;

/**
 * Optional 用来判断对象是否为空
 */
public class TestOptional {


    public static void main(String[] args) {
        Optional<String> op1 = Optional.of("abc");
        /**
         * 注意  Optional.of() 不能放入控制 不然会抛出NullPointerExecetion,
         * 如果放入空值需要使用ofNullable
         */
        // Optional op2 = Optional.of(null);
        Optional<String> op3 = Optional.ofNullable(null);

        /**
         * 判断值是否存在
         */
        if (op1.isPresent()) {
            String s1 = op1.get();
            System.out.println(s1);
        }
        /**
         * ifPresent Consumer类型接口， 如果值存在执行
         */
        op1.ifPresent(s -> System.out.println(s.toUpperCase()));
        /**
         * orElse  如果值为空则返回新值
         */
        String s3 = op3.orElse("zhangsan");
        System.out.println(s3);
        /**
         * orElseGet  如果值为空就执行Supplier接口返回值
         */
        String s4 = op3.orElseGet(() -> "hello world");
        System.out.println(s4);
        /**
         * orElseThrow 如果值为空就抛出异常
         */
        // op3.orElseThrow(()->new RuntimeException("值为空"));

        /**
         * 传入一个optional对象，获取名称
         */
        Person person = new Person(null, 20);
        String name = test02(Optional.ofNullable(person));
        System.out.println(name);

        Person person2 = new Person("李四", 20);
        String name2 = test02(Optional.ofNullable(person2));
        System.out.println(name2);

        System.out.println(test02(Optional.ofNullable(null)));
    }

    /**
     * 传入一个optional对象，获取名称
     */
    public static String test02(Optional<Person> opt) {
        String st = null;
        if (opt.isPresent()) {
            st = opt.map(Person::getName) //map方法进行转换类型
                    .map(o -> o.toUpperCase()).orElse("名称空值");
        }
        return st;
    }
}
